package com.imooc.pan.server.modules.file.service;

import com.imooc.pan.server.modules.file.context.*;
import com.imooc.pan.server.modules.file.entity.RPanUserFile;
import com.baomidou.mybatisplus.extension.service.IService;
import com.imooc.pan.server.modules.file.vo.*;

import java.util.List;

/**
 * @author lenovo
 * @description 针对表【r_pan_user_file(用户文件信息表)】的数据库操作Service
 * @createDate 2023-07-27 18:36:52
 */
public interface IUserFileService extends IService<RPanUserFile> {
    RPanUserFile getUserRootFileInfo(Long userId);

    /**
     * 创建文件夹
     *
     * @param createFolderContext 创建文件夹上下文
     * @return 文件夹 id
     */
    Long createFolder(CreateFolderContext createFolderContext);


    /**
     * 根据文件 id 集合，父文件 id，文件类型集合，删除标识查询文件
     *
     * @param context QueryFileListContext
     * @return RPanUserFileVO 集合
     */
    List<RPanUserFileVO> getFileList(QueryFileListContext context);

    /**
     * 更新文件名称
     * 1、首先要判断更新的名称是否重名
     * 2、更新文件名
     *
     * @param context UpdateFilenameContext
     */
    void updateFilename(UpdateFilenameContext context);

    void deleteFile(DeleteFileContext context);

    boolean secUpload(SecUploadFileContext context);

    void upload(FileUploadContext context);

    /**
     * 文件分片上传
     *
     * @param context
     * @return
     */
    FileChunkUploadVO chunkUpload(FileChunkUploadContext context);

    /**
     * 查询用户已上传的文件分片列表
     *
     * @param context
     * @return
     */
    UploadedChunksVO getUploadedChunks(QueryUploadedChunksContext context);

    /**
     * 文件分片合并
     *
     * @param context
     */
    void mergeFile(FileChunkMergeContext context);

    /**
     * 文件下载
     *
     * @param context
     */
    void download(FileDownloadContext context);


    /**
     * 文件下载，无需校验用户
     *
     * @param context
     */
    void downloadWithoutCheckUser(FileDownloadContext context);

    /**
     * 文件预览
     *
     * @param context
     */
    void preview(FilePreviewContext context);

    /**
     * 查询用户的文件夹树
     *
     * @param context
     * @return
     */
    List<FolderTreeNodeVO> getFolderTree(QueryFolderTreeContext context);

    /**
     * 文件转移
     *
     * @param context
     */
    void transfer(TransferFileContext context);

    /**
     * 文件复制
     *
     * @param context
     */
    void copy(CopyFileContext context);

    /**
     * 文件搜索
     *
     * @param context
     * @return
     */
    List<FileSearchResultVO> search(FileSearchContext context);

    /**
     * 获取面包屑列表
     *
     * @param context
     * @return
     */
    List<BreadcrumbVO> getBreadcrumbs(QueryBreadcrumbsContext context);

    /**
     * 递归查询所有的文件（子文件）信息
     *
     * @param records
     * @return
     */
    List<RPanUserFile> findAllFileRecords(List<RPanUserFile> records);

    /**
     * 根据文件 id 查找所有的未删除的文件（子文件）记录
     *
     * @param fileIdList
     * @return
     */
    List<RPanUserFile> findAllFileRecordsByFileIdList(List<Long> fileIdList);

    /**
     * 实体转换
     *
     * @param records
     * @return
     */
    List<RPanUserFileVO> transferVOList(List<RPanUserFile> records);
}
